﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Toto.Estado;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Toto.Componentes;

namespace Toto.Telas
{
    /// <summary>
    /// Classe base para telas que contêm um menu de opções. 
    /// O usuário pode mover para cima e para baixo para selecionar uma entrada, 
    /// </summary>
    public class MenuScreen : GameScreen
    {
        #region [ Fields ]

        /// <summary>
        /// Item selecionado
        /// </summary>
        private int selectedEntry = 0;

        /// <summary>
        /// Lista de itens do menu
        /// </summary>
        public List<MenuItem> MenuItens { get; set; }

        #endregion

        #region [ Properties ]

        public SpriteBatch SpriteBatch
        {
            get { return spriteBatch; }
        }

        #endregion

        #region [ Constructor ]

        /// <summary>
        /// Construtor da tela de menu de opções do jogo
        /// </summary>
        public MenuScreen(Game1 game)
            : base(game)
        {
            // Cria a lista de opções (menu)
            MenuItens = new List<MenuItem>();

            // Cria os itens do menu
            MenuItem gameplayItem = new MenuItem(game, GameState.Gameplay, "Play Game",Textura.btPlayGame);
            //MenuItem opcoesItem = new MenuItem(game, GameState.Opcoes, "Options", Textura.btOptions);
            MenuItem creditsItem = new MenuItem(game, GameState.Credits, "Credits", Textura.btCredits);
            MenuItem exitItem = new MenuItem(game, GameState.Exit, "Exit", Textura.btExit);

            // Adiciona os itens a lista de menu
            MenuItens.Add(gameplayItem);
            //MenuItens.Add(opcoesItem);
            MenuItens.Add(creditsItem);
            MenuItens.Add(exitItem);

            // Carrega a imagem de fundo
            background = Textura.telaMenu;
        }

        #endregion

        #region [ Update and Draw]

        /// <summary>
        /// Atualiza a tela de menu.
        /// </summary>
        public override void Update(GameTime gameTime)
        {
            // Chama o método Update do pai
            base.Update(gameTime);

            // Atualiza as entradas do teclado
            HandleInput();

            // Atualiza todos objetos do menu
            for (int i = 0; i < MenuItens.Count; i++)
            {
                MenuItens[i].Update(this, selectedEntry == i, gameTime);
            }
        }

        /// <summary>
        /// Desenha a tela de menu
        /// </summary>
        public override void Draw(GameTime gameTime)
        {
            spriteBatch.Draw(background, Vector2.Zero, Color.White);

            Vector2 position = new Vector2(450, 260);

            // Desenha os itens do menu
            for (int i = 0; i < MenuItens.Count; i++)
            {
                MenuItem menuEntry = MenuItens[i];

                bool isSelected = (i == selectedEntry);

                menuEntry.Draw(this, position - menuEntry.MeasureString() / 2, isSelected, gameTime);

                position.Y += menuEntry.GetHeight(this);
            }
        }
        #endregion

        #region [ Handle Input ]

        /// <summary>
        /// Responde a entrada do usuário, alterando a entrada selecionada no menu.
        /// </summary>
        private void HandleInput()
        {
            // Troca o item do menu para cima
            if (keyState.IsKeyDown(Keys.Up) && oldKeyState.IsKeyUp(Keys.Up))
            {
                selectedEntry--;

                if (selectedEntry < 0)
                    selectedEntry = MenuItens.Count - 1;
            }

            // Troca o item do menu para baixo
            if (keyState.IsKeyDown(Keys.Down) && oldKeyState.IsKeyUp(Keys.Down))
            {
                selectedEntry++;

                if (selectedEntry >= MenuItens.Count)
                    selectedEntry = 0;
            }

            // Seleciona o menu desejado trocando a tela
            if (keyState.IsKeyDown(Keys.Enter) && oldKeyState.IsKeyUp(Keys.Enter))
            {
                foreach (ScreenManager sm in game.Components)
                {
                    if (sm is ScreenManager)
                    {
                        if (selectedEntry == 0)
                        {
                            sm.ChangeScreen(GameState.Opcoes);
                        }
                        else
                        {
                            sm.ChangeScreen(MenuItens[selectedEntry].SelectedScreen);
                        }
                    }
                }
            }
        }

        #endregion
    }
}